/*!
 * 文件名称： bsp_adc.c
 * 描    述： bsp adc interface
 * 版本：     2023-12-03, V1.0
*/

/*
* GD32F303东方红开发板V1.0
* 淘宝商城：   https://juwo.taobao.com
* 技术交流：   https://www.gd32bbs.com/ask/
* 视频学习：   https://space.bilibili.com/475462605
* 微信公众号： gd32bbs
* Copyright    苏州聚沃电子科技有限公司
* 版权所有，盗版必究。
*/

#include "driver_adc.h"
#include "bsp_adc.h"

uint16_t Power_detect_data = 0;
uint16_t Rocker_data[2] ;
uint16_t Vref_Vtemp_data[2] ;

    
typdef_adc_ch_general  Power_detect_ADC = {
    .rcu_adc = RCU_ADC2,                                 /* ADC2的时钟 */
    .adc_psc = RCU_CKADC_CKAPB2_DIV6,                    /* ADC2设置为APB2 6分频 */
    .adc_port = ADC2,                                    /* ADC口为ADC2 */
    .adc_mode = ADC_MODE_FREE,                           /* ADC模式为独立模式 */
    .adc_channel_group = ADC_REGULAR_CHANNEL,            /* 使用规则组 */
    .adc_scan_function = DISABLE,                        /* 关闭扫描模式 */
    .adc_continuous_function = DISABLE,                  /* 关闭循环模式 */
    .ch_count = 1,                                       /* 转换长度为1 */
    .trigger_source = ADC0_1_2_EXTTRIG_REGULAR_NONE,     /* ADC触发源选择为软件触发 */
    .DMA_mode = DISABLE                                  /* 不使用DMA */
};
/* ADC通道参数配置，包括IO口，和对应通道以及采样周期 */
typdef_adc_ch_parameter Power_detect_ch_parameter = 
{
    .rcu_port = RCU_GPIOF,                               /* GPIOF时钟 */
    .port = GPIOF,                                       /* GPIO port */
    .pin = GPIO_PIN_6,                                   /* PF6 */
    .gpio_speed = GPIO_OSPEED_10MHZ,                     /* PF6速度设置为10MHz */
    .adc_channel = ADC_CHANNEL_4,                        /* PF6是ADC2的通道4 */
    .sample_time = ADC_SAMPLETIME_55POINT5               /* 设置采样周期为55.5 */
};



typdef_adc_ch_general  Rocker_ADC= {
    .rcu_adc = RCU_ADC2,                                 /* ADC2的时钟 */
    .adc_psc = RCU_CKADC_CKAPB2_DIV6,                    /* ADC2设置为APB2 6分频 */
    .adc_port = ADC2,                                    /* ADC口为ADC2 */
    .adc_mode = ADC_MODE_FREE,                           /* ADC模式为独立模式 */
    .adc_channel_group = ADC_REGULAR_CHANNEL,            /* 使用规则组 */
    .adc_scan_function = ENABLE,                         /* 开启扫描模式 */
    .adc_continuous_function = ENABLE,                   /* 开启循环模式 */
    .ch_count = 2,                                       /* 转换长度为2 */
    .dma_parameter = 
    {
        .rcu_dma = RCU_DMA1,                             /* DMA1的时钟 */
        .dma_periph = DMA1,                              /* 使用DMA1 */
        .dma_channel = DMA_CH4,                          /* 使用通道4 */
        .dma_number = 2,                                 /* DMA传输长度为2 */
        .dma_priority = DMA_PRIORITY_HIGH,               /* DMA通道优先级 */
        .dma_circulation_mode = ENABLE                   /* DMA循环模式打开 */
    },
    .trigger_source = ADC0_1_2_EXTTRIG_REGULAR_NONE,     /* ADC触发源选择为软件触发 */
    .DMA_mode = ENABLE                                   /* 使用DMA */
};



typdef_adc_ch_parameter Rocker_ch[2] = 
{
    {
    .rcu_port = RCU_GPIOF,                               /* GPIOF时钟 */
    .port = GPIOF,                                       /* GPIO port */
    .pin = GPIO_PIN_7,                                   /* PF7 */
    .gpio_speed = GPIO_OSPEED_10MHZ,                     /* PF7速度设置为10MHz */
    .adc_channel = ADC_CHANNEL_5,                        /* PF7是ADC2的通道5 */
    .sample_time = ADC_SAMPLETIME_55POINT5               /* 设置采样周期为55.5 */
    }
    ,
    {
    .rcu_port = RCU_GPIOF,                               /* GPIOF时钟 */
    .port = GPIOF,                                       /* GPIO port */
    .pin = GPIO_PIN_10,                                  /* PF8 */
    .gpio_speed = GPIO_OSPEED_10MHZ,                     /* PF8速度设置为10MHz */
    .adc_channel = ADC_CHANNEL_8,                        /* PF8是ADC2的通道6 */
    .sample_time = ADC_SAMPLETIME_55POINT5               /* 设置采样周期为55.5 */
    }
};/* ADC通道参数配置，包括IO口，和对应通道以及采样周期 */

typdef_adc_ch_general  VRef_VTem_ADC = {
    .rcu_adc = RCU_ADC0,                                 /* ADC0的时钟 */
    .adc_psc = RCU_CKADC_CKAPB2_DIV6,                    /* ADC0设置为APB2 6分频 */
    .adc_port = ADC0,                                    /* ADC口为ADC0 */
    .adc_mode = ADC_MODE_FREE,                           /* ADC模式为独立模式 */
    .adc_channel_group = ADC_INSERTED_CHANNEL,           /* 使用注入组 */
    .adc_scan_function = ENABLE,                         /* 开启扫描模式 */
    .adc_continuous_function = DISABLE,                  /* 关闭循环模式，因为使用的是注入组，故该参数实际无效 */
    .ch_count = 2,                                       /* 转换长度为2 */
    .trigger_source = ADC0_1_2_EXTTRIG_INSERTED_NONE,
    .DMA_mode = DISABLE                                  /* 不使用DMA */
};

typdef_adc_ch_parameter VRef_VTem_ch_parameter[2] = 
{
    {
    .rcu_port = (rcu_periph_enum)NULL,
    .port = NULL,
    .pin = NULL,
    .gpio_speed = NULL,
    .adc_channel = ADC_CHANNEL_16,                        /* 通道16 */
    .sample_time = ADC_SAMPLETIME_55POINT5                /* 设置采样周期为55.5 */
    }
    ,
    {
    .rcu_port = (rcu_periph_enum)NULL,
    .port = NULL,
    .pin = NULL,
    .gpio_speed = NULL,
    .adc_channel = ADC_CHANNEL_17,                        /* 通道17 */
    .sample_time = ADC_SAMPLETIME_55POINT5,               /* 设置采样周期为55.5 */
    }

};/* ADC通道参数配置，包括IO口，和对应通道以及采样周期 */

/*!
* 说明     电源电压检测ADC配置函数
* 输入     无
* 返回值   无
*/
void bsp_Power_detect_ADC_config()
{
    driver_adc_config(&Power_detect_ADC,&Power_detect_ch_parameter);
}

/*!
* 说明     电源电压检测ADC读数据寄存器
* 输入     无
* 返回值   无
*/
uint16_t bsp_Power_detect_data_get(void)
{
    uint32_t temp_value=0;
    for(uint8_t i=0;i<5;i++){
        delay_ms(1);
        temp_value+=driver_adc_transform_polling(&Power_detect_ADC,&Power_detect_ch_parameter);
    }    
    temp_value/=5;
    return temp_value;
}


/*!
* 说明     摇杆ADC配置函数
* 输入     无
* 返回值   无
*/
void bsp_Rocker_ADC_config()
{
    driver_adc_regular_ch_dma_config(&Rocker_ADC,Rocker_ch,(uint16_t*)Rocker_data);
    driver_adc_software_trigger_enable(&Rocker_ADC);    
}

/*!
* 说明     内部温度和Vrefint ADC配置函数
* 输入     无
* 返回值   无
*/
void bsp_Vref_Vtemp_ADC_config()
{
    /*ADC配置*/
    driver_adc_config(&VRef_VTem_ADC,VRef_VTem_ch_parameter);
    /*ADC中断打开*/
    ADC_int_enable(&VRef_VTem_ADC);
    /*NVIC设置*/
    nvic_irq_enable(ADC0_1_IRQn,0,0);
}

